/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Laue
 */
public class declaracaoConstantes {



    public boolean declaraConstantes(TabelaSimbolos tabelasimbolos){


        if(tabelasimbolos.reconhecer("const"))
        {
            // salva o tipo
            tabelasimbolos.salvaTipo(tabelasimbolos.getLookahead());

            if(Tipos.isDentroDeTipo(tabelasimbolos))
            {

                        if(tabelasimbolos.getTipo().equals("identificador"))
                        {
                            // insere tipo
                            tabelasimbolos.insertTipoVariavel();
                            // insere o escopo
                            tabelasimbolos.insertEscopo();
                            // insere categoria
                            
                            tabelasimbolos.insertCategoria("const");
                            if(tabelasimbolos.reconhecer(tabelasimbolos.getLookahead()))
                            {
                                if(tabelasimbolos.getLookahead().equals("["))
                                {
                                    while(tabelasimbolos.getLookahead().equals("["))
                                    {
                                        if(tabelasimbolos.reconhecer("["))
                                        {
                                            if(tabelasimbolos.getTipo().equals("identificador"))
                                            {
                                                if(tabelasimbolos.reconhecer(tabelasimbolos.getLookahead()))
                                                {
                                                    if(tabelasimbolos.getLookahead().equals("]"))
                                                    {
                                                        tabelasimbolos.soConsome();
                                                    }
                                                    else
                                                    {
                                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ] esperado");
                                                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                        return false; //se nao achar }
                                                    }
                                                }
                                                else
                                                    return false;
                                            }
                                            else if(tabelasimbolos.getTipo().equals("numero"))
                                            {
                                                if(tabelasimbolos.reconhecer(tabelasimbolos.getLookahead()))
                                                {
                                                    if(tabelasimbolos.getLookahead().equals("]"))
                                                    {
                                                        tabelasimbolos.soConsome();
                                                    }
                                                    else
                                                    {
                                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ] esperado");
                                                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                        return false; //se nao achar }
                                                    }
                                                }
                                                else
                                                    return false;

                                            }
                                            else
                                            {
                                                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " identificador ou numero esperado");
                                                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                return false; //se nao achar }
                                            }
                                        }
                                        else
                                        {
                                            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " [ esperado");
                                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                            return false; //se nao achar }
                                        }
                                    }
                                }
                                if(tabelasimbolos.getLookahead().equals("="))
                                {
                                    if(tabelasimbolos.reconhecer("="))
                                    {
                                        if(tabelasimbolos.getTipo().equals("numero"))
                                        {
                                            if(tabelasimbolos.reconhecer(tabelasimbolos.getLookahead()))
                                            {
                                                if(tabelasimbolos.reconhecer(";"))
                                                {
                                                    return true;
                                                }
                                                else
                                                {
                                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ; esperado");
                                                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                    return false; //se nao achar }
                                                }
                                            }
                                            else
                                                return false;
                                        }
                                        else if(tabelasimbolos.getLookahead().equals("true") || tabelasimbolos.getLookahead().equals("false"))
                                        {
                                            if(tabelasimbolos.reconhecer(tabelasimbolos.getLookahead()))
                                            {
                                                if(tabelasimbolos.reconhecer(";"))
                                                {
                                                    return true;
                                                }
                                                else
                                                {
                                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ; esperado");
                                                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                    return false; //se nao achar }
                                                }
                                            }
                                            else
                                                return false;
                                        }
                                        else if(tabelasimbolos.getLookahead().length() == 2 || tabelasimbolos.getLookahead().length() == 3)
                                        {
                                            if(tabelasimbolos.getTipo().equals("frase"))
                                            {
                                                if(tabelasimbolos.reconhecer(tabelasimbolos.getLookahead()))
                                                {
                                                    if(tabelasimbolos.reconhecer(";"))
                                                    {
                                                        return true;
                                                    }
                                                    else
                                                    {
                                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ; esperado");
                                                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                        return false; //se nao achar }
                                                    }
                                                }
                                                else
                                                    return false;
                                            }
                                            else
                                                return false;

                                        }
                                        else if(tabelasimbolos.getTipo().equals("frase"))
                                        {
                                            if(tabelasimbolos.reconhecer(tabelasimbolos.getLookahead()))
                                            {
                                                if(tabelasimbolos.getLookahead().equals(";"))
                                                {
                                                    if(tabelasimbolos.reconhecer(";"))
                                                    {
                                                        return true;
                                                    }
                                                    else
                                                    {
                                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ; esperado");
                                                        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                        return false; //se nao achar }
                                                    }
                                                }
                                                else
                                                    return false;
                                            }
                                            else
                                                return false;
                                        }
                                        else if(tabelasimbolos.getLookahead().equals("{"))
                                        {
                                            if(tabelasimbolos.reconhecer("{"))
                                            {
                                                if(tabelasimbolos.getTipo().equals("numero"))
                                                {
                                                    if(tabelasimbolos.reconhecer(tabelasimbolos.getLookahead()))
                                                    {
                                                        while(tabelasimbolos.getLookahead().equals(","))
                                                        {
                                                            if(tabelasimbolos.reconhecer(","))
                                                            {
                                                                if(tabelasimbolos.getTipo().equals("numero"))
                                                                {
                                                                    tabelasimbolos.soConsome();
                                                                }
                                                                else
                                                                {
                                                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " numero esperado");
                                                                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                                    return false; //se nao achar }
                                                                }
                                                            }
                                                            else
                                                                return false;
                                                        }
                                                        if(tabelasimbolos.getLookahead().equals("}"))
                                                        {
                                                            tabelasimbolos.soConsome();
                                                            if(tabelasimbolos.reconhecer(";"))
                                                            {
                                                                return true;
                                                            }
                                                            else
                                                            {
                                                                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ; esperado");
                                                                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                                return false; //se nao achar }
                                                            }
                                                        }
                                                        else
                                                        {
                                                            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " } esperado");
                                                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                            return false; //se nao achar }
                                                        }
                                                    }
                                                    else
                                                        return false;
                                                }
                                                else
                                                {
                                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " numero esperado");
                                                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                    return false; //se nao achar }
                                                }
                                            }
                                            else
                                                return false;
                                        }
                                        else
                                        {
                                            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " {numero} ou frase ou caractere ou boolean ou numero esperado");
                                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                            return false; //se nao achar }
                                        }
                                    }
                                    else
                                        return false;
                                }
                                else
                                {
                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " = esperado");
                                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                    return false; //se nao achar }
                                }
                            }
                            else
                                return false;


                        }
                        else
                        {
                            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " identificador esperado");
                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                            return false; //se nao achar }
                        }
            }
            else
            {
                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " tipo esperado");
                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                return false; //se nao achar }
            }

        }
        else
        {
            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " const esperado");
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false; //se nao achar }
        }
    }
}
